//
//  Bridge_Pattern.cpp
//  HelloWorld
//
//  Created by Kevin Tang on 31/12/14.
//  Copyright (c) 2014年 Kevin Tang. All rights reserved.
//

#include "Bridge_Pattern.h"
using namespace CarRunOnRoad;
void test_brigde ()
{
    
    CarOnSpeedWay car = CarOnSpeedWay();
    car.Run();
    CaronStreetWay carstreed = CaronStreetWay();
    carstreed.Run();
    //如果我们还要增加条路，叫崎岖小路，
    //那么汽车类(增加两个，一个是小汽车在崎岖小路上行驶,另一个是公共汽车在崎岖小路上行驶)
    //另外，若再加一种叫老爷车，它可以在上述三种路上行驶。那么这个老爷车，也要写三个类。所以
    //小汽车类(三个){在高速路，在街道，在崎岖小路}
    //公共汽车类(三个){在高速路，在街道，在崎岖小路}
    //老爷车类(三个){在高速路，在街道，在崎岖小路}
    //如果在这种情况下，我们再增加一条路，那么，上述三种车，都要增加一个类。
    //这种情况，类变得越来越多，每增加一条路，或一种车，都出现爆炸情增长。
    //下面我们看看，桥接模式如何解决很好的解决这个问题
    
    cout << "============注意释构函数的调用顺序,这也就是为什么要将基类的释构函数声明为虚的==================="<<endl;
    //基类指针，指向子类对象,删除基类指针时，由基类释构函数是虚函数，所以会先调用，子类对象的释构函数，以保证内存被释放
    CarRunOnRoadBridge::AbStractRoad *road = new CarRunOnRoadBridge::StreetRoad(new CarRunOnRoadBridge::Car());
    road->Open();
    delete road;
    cout << "============注意释构函数的调用顺序,这也就是为什么要将基类的释构函数声明为虚的==================="<<endl;
    //创建一条路，然后给路传递一辆车，这辆车就在这条路上行驶
    CarRunOnRoadBridge::SpeedWay *speedway = new CarRunOnRoadBridge::SpeedWay(new CarRunOnRoadBridge::Car());
    speedway->Open();
    delete speedway;
    cout << "============注意释构函数的调用顺序,这也就是为什么要将基类的释构函数声明为虚的==================="<<endl;
    //公共汽车行驶在高速路上
    CarRunOnRoadBridge::SpeedWay *busSpeedway = new CarRunOnRoadBridge::SpeedWay(new CarRunOnRoadBridge::Bus());
    busSpeedway->Open();
    delete busSpeedway;
    cout << "============注意释构函数的调用顺序,这也就是为什么要将基类的释构函数声明为虚的==================="<<endl;
    
}




